from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver import ActionChains
import time

'''
PO:业务和元素操作 分离
1. BasePage: 元素操作，所有的网页都需要操作元素
2. SearchPage: 具体业务的页面

单元测试：业务的结果在单元测试里面验证的



'''
class BasePage():
    '''这是所有页面的基类，会封装元素操作'''

    def __init__(self, driver, url):
        self.driver = driver
        self.url = url

    # 访问某个网页
    def get(self):
        self.driver.get(self.url)

    # 显示等待，定位元素
    # *locate : 可变参数， By.ID,"kw"
    def find_element(self, *locate):
        return WebDriverWait(self.driver, 15, 0.5).until(EC.presence_of_element_located((locate)))
    # 显示等待，定位元素
    # *locate : 可变参数， By.ID,"kw"
    def find_elements(self, *locate):
        return WebDriverWait(self.driver, 15, 0.5).until(EC.presence_of_all_elements_located((locate)))

    # 输入框输入内容
    # element: 元素
    # content： 输入框要输入的内容
    def send_keys(self, element, content):
        element.send_keys(content)

    #content: 输入框要输入的内容
    #by: 定位的方式
    #value： 定位方式对应的值
    def send_keys(self, content,by,value):
        self.find_element(by,value).send_keys(content)

    # 清除输入框内容
    def clear(self,by,value):
        self.find_element(by,value).clear()

    # 点击
    def click(self,by,value):
        self.find_element(by,value).click()

    # 悬浮
    def move_to_element(self,by,value):
        ActionChains(self.driver).move_to_element(self.find_element(by, value)).perform()

    # 拿到窗口的列表
    def switch_window(self,index):
        windows =  self.driver.window_handles
        self.driver.switch_to.window(windows[index])

    # 滑动到底部
    def scroll_bottom(self):
        # 执行js代码滑动到底部
        self.driver.execute_script('window.scrollBy(0,100000)')

    # 滑动到某个元素可见
    def scroll_to_element(self,ele):
        self.driver.execute_script("arguments[0].scrollIntoView(true);", ele)

    # 切换到主页面frame
    def switch_main_frame(self):
        self.driver.switch_to.default_content()

    # 滑动到顶部
    def scroll_to_top(self):
        # 执行js代码滑动到底部
        self.driver.execute_script('window.scrollTo(0,0)')

    # 隐式等待
    def implicitly_wait(self,sec):
        self.driver.implicitly_wait(sec)






